﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Windows.Forms;

namespace Atentis_Connector
{

	/// <summary>
	/// Финансовый инструмент - класс-агригатор основных параметров
	/// </summary>
	class WorkWithSec
	{
		private bool m_IsStarted;
		/// <summary>
		/// Торгуется ли инструмент
		/// </summary>
		public bool IsStarted { get { return m_IsStarted; } set { m_IsStarted = value; } }

		private string m_SecCode;
		/// <summary>
		/// Код торгового инструмента
		/// </summary>
		public string SecCode { get { return m_SecCode; } set { m_SecCode = value; } }

		private CandleList m_CandleList;
		/// <summary>
		/// Список свечей
		/// </summary>
		public CandleList CandleList { get { return m_CandleList; } set { m_CandleList = value; } }

		private List<IStrategy> m_Strategies;
		/// <summary>
		/// Список стратегий
		/// </summary>
		public List<IStrategy> Strategies { get { return m_Strategies; } set { m_Strategies = value; } }

		/// <summary>
		/// Список названий стратегий
		/// </summary>
		public List<string> StrategiesNames {
			get {
				var snames = new List<string>();
				foreach (var strategy in m_Strategies)
				{
					snames.Add(strategy.StrategyName);
				}
				return snames; 
			}
		}

		private MoneyControl m_MoneyControl;
		/// <summary>
		/// Экземпляр контроля капитала для инструмента
		/// </summary>
		public MoneyControl MoneyControl { get { return m_MoneyControl; } set { m_MoneyControl = value; } }

		public WorkWithSec(string secCode)
		{
			m_SecCode = secCode;
			m_CandleList = new CandleList();
			m_Strategies = new List<IStrategy>();
			m_MoneyControl = new MoneyControl();
			m_MoneyControl.SecCode = secCode;
			m_IsStarted = false;
		}

		/// <summary>
		/// Событие - исполнен ордер на покупку.
		/// </summary>
		public Action<int, double> BuyOrderComplete;

		private void OnBuyOrderComplete(int vol, double price)
		{
			if (BuyOrderComplete != null)
				BuyOrderComplete(vol, price);
		}

		/// <summary>
		/// Событие - исполнен ордер на продажу.
		/// </summary>
		public Action<int, double> SellOrderComplete;

		private void OnSellOrderComplete(int vol, double price)
		{
			if (SellOrderComplete != null)
				SellOrderComplete(vol, price);
		}

		/// <summary>
		/// Событие - обновлена позиция по бумагам.
		/// </summary>
		public Action<int> PositionsUpdated;

		private void OnPositionsUpdated(int newPos)
		{
			if (PositionsUpdated != null)
				PositionsUpdated(newPos);
		}
		/// <summary>
		/// Проверка - пришла ли своя сделка покупки, если да - генерация события
		/// </summary>
		/// <param name="row">Строка таблицы сделок</param>
		public void ProcessBuyTrade(WrapperTrades row)
		{
            if (SecCode == row.SecCode)
			    OnBuyOrderComplete((int)row.Value, row.Price);
		}
		/// <summary>
		/// Проверка - пришла ли своя сделка продажи, если да - генерация события
		/// </summary>
		/// <param name="row">Строка таблицы сделок</param>
		public void ProcessSellTrade(WrapperTrades row)
		{
            if (SecCode == row.SecCode)
			    OnSellOrderComplete((int)row.Value, row.Price);
		}
		/// <summary>
		/// Проверка - изменилась ли позиция по бумаге, если да - генерация события
		/// </summary>
		/// <param name="row">Строка таблицы позиций по бумагам</param>
		public void ProcessPositions(WrapperFirm_Holding_Total row)
		{
			OnPositionsUpdated((int)row.CurrentPos);
		}

	}
}
